home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
TPUG - Toronto PET Users Group
/
TPUG Users Group CD
/
TPUG Users Group CD.iso
/
AMIGA
/
AMICUS
/
AMICUS25.ADF
/
SoftBallStats
/
SoftStats
< prev
next >
Wrap
Text File
|
1989-01-26
|
20KB
|
772 lines
CLEAR ,40000&
GOSUB ClearDB
MenuSetup:
MENU 1,0,1,"PROJECT"
MENU 1,1,1,"Open "
MENU 1,2,1,"Save "
MENU 1,3,1,"Print "
MENU 1,4,1,"Quit "
MENU 2,0,1,"ROSTER"
MENU 2,1,1,"Add "
MENU 2,2,1,"Delete"
MENU 2,3,1,"New "
MENU 3,0,1,"STATISTICS"
MENU 3,1,1,"Enter "
MENU 4,0,1,"VIEW "
MENU 4,1,1,"Game "
MENU 4,2,1,"Cumulative"
MENU 4,3,1,"History "
ON MENU GOSUB MenuHandler
NPlayers=NPMAX
GNumber=NGMAX
GOSUB Game
Iloop:
MENU ON
WHILE -1: WEND
MenuHandler:
menuID=MENU(0)
itemID=MENU(1)
X=0:GOSUB Ghost
ON menuID GOSUB ProjectMenu,RosterMenu,StatisticsMenu,ViewMenu
X=1:GOSUB Ghost
RETURN Iloop
ProjectMenu:
ON itemID GOSUB OpenFile,SaveFile,PrintFile,Quit
RETURN
RosterMenu:
ON itemID GOSUB Add,Delete1,NewFile
RETURN
StatisticsMenu:
ON itemID GOSUB Enter
RETURN
ViewMenu:
ON itemID GOSUB Game,Cumulative,History
RETURN
Ghost:
MENU 1,0,X
MENU 2,0,X
MENU 3,0,X
MENU 4,0,X
RETURN:
NewFile:
MENU OFF
Temp$=""
CALL StringRequest("NEW ROSTER","Enter Team Name","OK","CANCEL",Temp$)
IF which=3 THEN
Temp$=""
RETURN
END IF
ERASE work%,x1,x2,y1,y2
ERASE PlayerName$,PGameStats,PCumStats,GDates$
ERASE GScores$,TGameStats,TCumStats,TCumTotals
GOSUB ClearDB
CLS
TeamName$=Temp$
LOCATE 1,35:COLOR 2:PRINT TeamName$;" Roster":COLOR 1:PRINT
NameLoop:
NPlayers=NPlayers+1
IF NPlayers>NPMAX THEN
CALL Requester("Too Many","Players","OK","OK",0,X)
GOTO DoneName
END IF
Temp1$="Enter Name of Player "+STR$(NPlayers)
Temp$=""
CALL StringRequest("NEW ROSTER",Temp1$,"OK","DONE",Temp$)
IF which=3 AND Temp$="" THEN
GOTO DoneName
ELSEIF which=3 THEN
PlayerName$(NPlayers)=Temp$
NPlayers=NPlayers+1
GOTO DoneName
ELSE
PlayerName$(NPlayers)=Temp$
END IF
LOCATE NPlayers+1,35: PRINT PlayerName$(NPlayers);
GOTO NameLoop
DoneName:
NPlayers=NPlayers-1
GOSUB LastScreen
MENU ON
RETURN
OpenFile:
MENU OFF
Temp$=RIGHT$(STR$(GNumber),2)
IF GNumber<10 THEN Temp$=RIGHT$(STR$(GNumber),1)
filname$=TeamName$+".Game"+Temp$
X=MOUSE(0)
CALL OpenRequest(filname$)
IF which=3 THEN RETURN
EFlag$="OPEN"
ERASE work%,x1,x2,y1,y2
ERASE PlayerName$,PGameStats,PCumStats,GDates$
ERASE GScores$,TGameStats,TCumStats,TCumTotals
GOSUB ClearDB
ON ERROR GOTO ErrorTrap
OPEN filname$ FOR INPUT AS #1
INPUT #1,TeamName$,GNumber,NPlayers,NWins,NLosses,NCSTATS,NGSTATS
FOR I=1 TO NPlayers
INPUT #1,PlayerName$(I)
FOR J=1 TO NGSTATS
INPUT #1,PGameStats(I,J)
NEXT J
FOR J=1 TO NCSTATS
INPUT #1,PCumStats(I,J)
NEXT J
NEXT I
FOR I=1 TO GNumber
INPUT #1,GDates$(I),GScores$(I)
FOR J=1 TO NCSTATS
INPUT #1,TCumStats(I,J)
NEXT J
NEXT I
FOR I=1 TO NGSTATS
INPUT #1,TGameStats(I)
NEXT I
FOR J=1 TO NCSTATS
INPUT #1,TCumTotals(J)
NEXT J
CLOSE #1
ON ERROR GOTO 0
FileFlag$="F"
GOSUB LastScreen
RETURN
SaveFile:
MENU OFF
Temp$=RIGHT$(STR$(GNumber),2)
IF GNumber<10 THEN Temp$=RIGHT$(STR$(GNumber),1)
filename$=TeamName$+".Game"+Temp$
X=MOUSE(0)
CALL SaveRequest(filename$)
IF which=3 THEN RETURN
COLOR 1,0
EFlag$="SAVE"
ON ERROR GOTO ErrorTrap
OPEN filename$ FOR OUTPUT AS #1
WRITE #1,TeamName$,GNumber,NPlayers,NWins,NLosses,NCSTATS,NGSTATS
FOR I=1 TO NPlayers
WRITE #1,PlayerName$(I)
FOR J=1 TO NGSTATS
WRITE #1,PGameStats(I,J)
NEXT J
FOR J=1 TO NCSTATS
WRITE #1,PCumStats(I,J)
NEXT J
NEXT I
FOR I=1 TO GNumber
WRITE #1,GDates$(I),GScores$(I)
FOR J=1 TO NCSTATS
WRITE #1,TCumStats(I,J)
NEXT J
NEXT I
FOR I=1 TO NGSTATS
WRITE #1,TGameStats(I)
NEXT I
FOR J=1 TO NCSTATS
WRITE #1,TCumTotals(J)
NEXT J
CLOSE #1
ON ERROR GOTO 0
FileFlag$="T"
RETURN
PrintFile:
EFlag$="PRINT"
ON ERROR GOTO ErrorTrap
OPEN "PRT:" FOR OUTPUT AS #1
PRINT #1,
PRINT #1,
PRINT #1,CHR$(27);"[6w";
PRINT #1,STRING$(40,ASC("*"))
Temp$=" GAME STATISTICS"
X=(40-LEN(TeamName$)-LEN(Temp$))/2
PRINT #1,TAB(X);UCASE$(TeamName$)+Temp$
PRINT #1,STRING$(40,ASC("*"))
PRINT #1,CHR$(27);"[5w";
GOSUB GPrint:PRINT #1,
PRINT #1,CHR$(27);"[6w";
PRINT #1,STRING$(40,ASC("*"))
Temp$=" CUMULATIVE STATISTICS"
X=(40-LEN(TeamName$)-LEN(Temp$))/2
PRINT #1,TAB(X);UCASE$(TeamName$)+Temp$
PRINT #1,STRING$(40,ASC("*"))
PRINT #1,CHR$(27);"[5w";
GOSUB CPrint:PRINT #1,
PRINT #1,CHR$(27);"[6w";
PRINT #1,STRING$(40,ASC("*"))
Temp$=" SEASON HISTORY"
X=(40-LEN(TeamName$)-LEN(Temp$))/2
PRINT #1,TAB(X);UCASE$(TeamName$)+Temp$
PRINT #1,STRING$(40,ASC("*"))
PRINT #1,CHR$(27);"[5w";
GOSUB HPrint:PRINT #1,
CLOSE #1
GOSUB LastScreen
RETURN
Quit:
IF FileFlag$="F" THEN
CALL Requester("File Not Saved","","QUIT","NO!",0,X)
IF X=0 THEN RETURN
END IF
MENU RESET
LIBRARY CLOSE
CLS
CLEAR ,25000
SYSTEM
END
RETURN
Add:
IF NPlayers=NPMAX THEN
CALL Requester("Can't Add Anymore Players!","","OK","OK",0,X)
RETURN
END IF
NPlayers=NPlayers+1
Temp1$="Name of Player "+STR$(NPlayers)+" ?"
Temp$=""
CALL StringRequest("ADD",Temp1$,"OK","CANCEL",Temp$)
IF which=3 THEN
NPlayers=NPlayers-1
GOSUB LastScreen
RETURN
END IF
PlayerName$(NPlayers)=Temp$
GOTO Add
RETURN
Delete1:
IF NPlayers=0 THEN
CALL Requester("No Players Left!","Can't Delete","OK","OK",0,Y)
RETURN
END IF
Temp1$="Name of Player to DELETE ?"
Temp$=""
CALL StringRequest("DELETE",Temp1$,"OK","CANCEL",Temp$)
IF which=3 THEN
GOSUB LastScreen
RETURN
END IF
X=0
FOR I=1 TO NPlayers
IF Temp$=PlayerName$(I) THEN X=I
NEXT I
IF X=0 THEN
CALL Requester(Temp$ + " Not Found","Can't Delete","OK","OK",0,Y)
GOTO Delete1
END IF
FOR I=X TO NPlayers-1
PlayerName$(I)=PlayerName$(I+1)
FOR J=1 TO NGSTATS
PGameStats(I,J)=PGameStats(I+1,J):PGameStats(I+1,J)=0
NEXT J
FOR J=1 TO NCSTATS
PCumStats(I,J)=PCumStats(I+1,J):PCumStats(I+1,J)=0
NEXT J
NEXT I
NPlayers=NPlayers-1
GOTO Delete1
RETURN
Enter:
GNumber=GNumber+1
IF GNumber>NGMAX THEN
CALL Requester("Max Number of","Games Exceeded","OK","OK",X)
GNumber=GNumber-1
GOSUB LastScreen
RETURN
END IF
CLS
FileFlag$="F"
LOCATE 11,20:COLOR 2
PRINT "Enter Game Date >>"
LOCATE 12,20:PRINT "(MM/DD/YY)"
COLOR 1:LOCATE 11,40:INPUT;"",GDates$(GNumber)
CLS
LOCATE 11,20:COLOR 2
PRINT "Enter Game Score >>"
LOCATE 12,20:PRINT "(Winner x Loser y)"
COLOR 1:LOCATE 11,40:INPUT;"",GScores$(GNumber)
Temp1$= UCASE$(LEFT$(GScores$(GNumber),4))
Temp2$= UCASE$(LEFT$(TeamName$,4))
IF (Temp1$=Temp2$) THEN NWins=NWins+1 ELSE NLosses=NLosses+1
FOR I=1 TO NPlayers
CLS
LOCATE 21,1:COLOR 2
PRINT "Enter Game Stats for ";PlayerName$(I);" >>"
PRINT "(AB,R,H,RBI,SF,BB,2B,3B,HR,E,BP)";
COLOR 1
LOCATE 21,42:INPUT;"", Temp$
LOCATE 21,42:PRINT SPACE$(35);
IF Temp$="" THEN Temp$="000000000000000"
FOR J=1 TO NGSTATS
PGameStats(I,J)=VAL(MID$(Temp$,J,1))
NEXT J
NEXT I
CLS
GOSUB Update
GOSUB LastScreen
FileFlag$="F"
RETURN
Game:
MENU OFF
CLS
Scrn$="Game"
OPEN "SCRN:" FOR OUTPUT AS #1
GOSUB GPrint
CLOSE #1
RETURN
GPrint:
COLOR 2:LOCATE 1,1
PRINT #1,"GAME NUMBER: ";:COLOR 1:PRINT #1, GNumber;TAB(22);:COLOR 2
PRINT #1,"DATE: ";:COLOR 1:PRINT #1,GDates$(GNumber);TAB(37);:COLOR 2
PRINT #1,"SCORE: ";:COLOR 1:PRINT #1,GScores$(GNumber):COLOR 2
PRINT #1,
PRINT #1," N ";"PLAYER";TAB(21);"AB";TAB(26);"R";TAB(30);"H";
PRINT #1,TAB(32);"RBI";TAB(36);"SAC";TAB(41);"BB";
PRINT #1,TAB(45);"2B";TAB(49);"3B";TAB(53);"HR";
PRINT #1,TAB(58);"E";TAB(60);"BHP"
FOR I=1 TO NPlayers
COLOR 3
PRINT #1,USING"## ";I;
COLOR 1
PRINT #1,USING "\ \";PlayerName$(I);
COLOR 3
PRINT #1,TAB(20);:PRINT #1,USING "### ";PGameStats(I,AB);
PRINT #1,USING "### ";PGameStats(I,R);
PRINT #1,USING "### ";PGameStats(I,H);PGameStats(I,RBI);
PRINT #1,USING "### ";PGameStats(I,SF);PGameStats(I,BB);PGameStats(I,B2);
PRINT #1,USING "### ";PGameStats(I,B3);PGameStats(I,HR);PGameStats(I,E);
PRINT #1,USING "### ";PGameStats(I,BP)
NEXT I
COLOR 2:PRINT #1," TOTALS";:COLOR 1
PRINT #1,TAB(20);:PRINT #1,USING "### ";TGameStats(AB);
PRINT #1,USING "### ";TGameStats(R);
PRINT #1,USING "### ";TGameStats(H);TGameStats(RBI);
PRINT #1,USING "### ";TGameStats(SF);TGameStats(BB);TGameStats(B2);
PRINT #1,USING "### ";TGameStats(B3);TGameStats(HR);TGameStats(E);
PRINT #1,USING "### ";TGameStats(BP);
RETURN
Cumulative:
MENU OFF
CLS
Scrn$="Cumulative"
OPEN "SCRN:" FOR OUTPUT AS #1
GOSUB CPrint
CLOSE #1
RETURN
CPrint:
COLOR 2:PRINT #1,"GAMES PLAYED: ";:COLOR 1:PRINT #1,GNumber;TAB(30);
COLOR 2:PRINT #1,"TEAM NAME: ";:COLOR 1:PRINT #1,TeamName$;TAB(55);
COLOR 2:PRINT #1,"WON: ";:COLOR 1:PRINT #1,NWins;TAB(65);
COLOR 2:PRINT #1,"LOST: ";:COLOR 1:PRINT #1,NLosses
PRINT #1,:COLOR 2
PRINT #1," N ";"PLAYER";TAB(21);"G";TAB(24);"AB";TAB(29);"R";TAB(33);"H";
PRINT #1,TAB(35);"RBI";TAB(39);"SAC";TAB(44);"BB";
PRINT #1,TAB(48);"2B";TAB(52);"3B";TAB(56);"HR";
PRINT #1,TAB(61);"E";TAB(63);"BHP";TAB(69);"SLG";TAB(75);"AVG"
FOR I=1 TO NPlayers
COLOR 3
PRINT #1,USING"## ";I;
COLOR 1
PRINT #1,USING "\ \";PlayerName$(I);
COLOR 3
PRINT #1,TAB(20);:PRINT #1,USING "## ";PCumStats(I,G);
PRINT #1,USING "### ";PCumStats(I,AB);
PRINT #1,USING "### ";PCumStats(I,R);
PRINT #1,USING "### ";PCumStats(I,H);PCumStats(I,RBI);
PRINT #1,USING "### ";PCumStats(I,SF);PCumStats(I,BB);PCumStats(I,B2);
PRINT #1,USING "### ";PCumStats(I,B3);PCumStats(I,HR);PCumStats(I,E);
PRINT #1,USING "### ";PCumStats(I,BP);
Temp$=" .### ":IF PCumStats(I,SLG)>=1000 THEN Temp$="#.### "
PRINT #1,USING Temp$;PCumStats(I,SLG)/1000;
Temp$=" .### ":IF PCumStats(I,AVG)=1000 THEN Temp$="#.### "
PRINT #1,USING Temp$;PCumStats(I,AVG)/1000
NEXT I
COLOR 2:PRINT #1," TOTALS";
COLOR 1
PRINT #1,TAB(20);:PRINT #1," ";
PRINT #1,USING "### ";TCumTotals(AB);
PRINT #1,USING "### ";TCumTotals(R);
PRINT #1,USING "### ";TCumTotals(H);TCumTotals(RBI);
PRINT #1,USING "### ";TCumTotals(SF);TCumTotals(BB);TCumTotals(B2);
PRINT #1,USING "### ";TCumTotals(B3);TCumTotals(HR);TCumTotals(E);
PRINT #1,USING "### ";TCumTotals(BP);
PRINT #1,USING " .### ";TCumTotals(SLG)/1000;
Temp$=" .### ":IF TCumTotals(AVG)=1000 THEN Temp$="#.### "
PRINT #1,USING Temp$;TCumTotals(AVG)/1000;
RETURN
History:
MENU OFF
CLS
Scrn$="History"
OPEN "SCRN:" FOR OUTPUT AS #1
GOSUB HPrint
CLOSE #1
RETURN
HPrint:
COLOR 2
PRINT #1,TAB(32);"WON:";:COLOR 1:PRINT #1, USING "## ";NWins;
COLOR 2:PRINT #1,"LOST:";:COLOR 1:PRINT #1,NLosses:COLOR 2
PRINT #1,
PRINT #1," N";TAB(4);"DATE";TAB(13);"SCORE";TAB(49);"AB";
PRINT #1,TAB(53);"H";TAB(55);"BB";TAB(58);"2B";TAB(61);"3B";
PRINT #1,TAB(64);"HR";TAB(68);"E";TAB(70);"BHP";TAB(75);"AVG"
COLOR 1
FOR I=1 TO GNumber
PRINT #1,USING "## ";I;
PRINT #1,USING "\ \";GDates$(I);
PRINT #1,GScores$(I);TAB(49);
PRINT #1,USING "## ";TCumStats(I,AB);TCumStats(I,H);TCumStats(I,BB);
PRINT #1,USING "## ";TCumStats(I,B2);TCumStats(I,B3);TCumStats(I,HR);TCumStats(I,E);
PRINT #1,USING " ## ";TCumStats(I,BP);
PRINT #1,USING ".###";TCumStats(I,AVG)/1000
NEXT I
COLOR 1
RETURN
ClearDB:
'**** Intuits header ****
DEFINT a-z
'Global arrays and variables
DIM work%(400)
DIM x1(5),y1(5),x2(5),y2(5) 'more than 5 gadgets is impractical
ScrId=-1 'Screen for windows
which=0 'which box is selected
BoxIndex=1 'How many gadgets
maxlen=25 'length of text fields
'**********************************
X=0:Y=0:I=0:J=0:K=0
EFlag$=""
Scrn$="Game" 'Cumulative, Game or History
Temp1$="":Temp2$=""
TeamName$="NoName" 'Teamname
FileFlag$="F" 'File Saved flag
NPlayers=0 'Current number of players on roster
GNumber=0 'Current Game Number
filename$="NoName.Game0"
NPMAX=19 'Maximum Number of Players
NGMAX=19 'Maximum Number of Games
NWins=0:NLosses=0 'Current Number of wins and losses
NGSTATS=15 'AB,R,H,RBI,SF,BB,2B,3B,HR,E,BP
NCSTATS=20 'AB,R,H,RBI,SF,BB,2B,3B,HR,E,BP,G,SLG,AVG
AB=1:R=2:H=3:RBI=4:SF=5:BB=6:B2=7:B3=8
HR=9:E=10:BP=11:G=12:SLG=13:AVG=14
NCOMMON=11 'AB,R,H,RBI,SF,BB,2B,3B,HR,E,BP
DIM PlayerName$(NPMAX) 'Array of Player Names
FOR I=0 TO NPMAX
PlayerName$(I)="NoName"
NEXT I
DIM PGameStats(NPMAX,NGSTATS) 'Array of Player Game Stats
DIM PCumStats(NPMAX,NCSTATS) 'Array of player Cumulative stats
DIM TCumTotals(NCSTATS) 'Array of Team Cumulative stats
DIM GDates$(NGMAX) 'Array for game dates
DIM GScores$(NGMAX) 'Array for game scores
FOR I=0 TO NGMAX
GDates$(I)="NoDate"
GScores$(I)="NoScore"
NEXT I
DIM TGameStats(NGSTATS) 'Array for Team Game Statistics
DIM TCumStats(NGMAX,NCSTATS) 'Array for Team History Stats
RETURN
LastScreen:
IF Scrn$="Cumulative" THEN
GOSUB Cumulative
ELSEIF Scrn$="Game" THEN
GOSUB Game
ELSE
GOSUB History
END IF
RETURN
Update:
CLS:LOCATE 11,35:COLOR 0,1:PRINT "UPDATING......":COLOR 1,0
FOR I=1 TO NGSTATS
TGameStats(I)=0
NEXT I
FOR I=1 TO NPlayers
IF (PGameStats(I,AB)<>0 OR PGameStats(I,BB)<>0 OR PGameStats(I,SF)<>0)THEN PCumStats(I,G)=PCumStats(I,G)+1
FOR J=1 TO NCOMMON
PCumStats(I,J)=PCumStats(I,J)+PGameStats(I,J)
TGameStats(J)=TGameStats(J)+ PGameStats(I,J)
TCumStats(GNumber,J)=TGameStats(J)
TCumTotals(J)=TCumTotals(J)+PGameStats(I,J)
NEXT J
IF PCumStats(I,AB)=0 THEN Skip1
PCumStats(I,AVG)=INT(PCumStats(I,H)/PCumStats(I,AB)*1000+.5)
Skip1:
IF PCumStats(I,H)=0 THEN Skip2
X=PCumStats(I,H)-PCumStats(I,B2)-PCumStats(I,B3)-PCumStats(I,HR)
PCumStats(I,SLG)=INT(1000*(X+PCumStats(I,B2)*2+PCumStats(I,B3)*3+PCumStats(I,HR)*4)/(PCumStats(I,AB))+.5)
Skip2:
NEXT I
IF TCumStats(GNumber,AB)=0 THEN Skip3
TCumTotals(AVG)=INT(TCumTotals(H)/TCumTotals(AB)*1000+.5)
TCumStats(GNumber,AVG)=INT(TCumStats(GNumber,H)/TCumStats(GNumber,AB)*1000+.5)
Skip3:
IF TCumStats(GNumber,H)=0 THEN Skip4
X=TCumStats(GNumber,H)-TCumStats(GNumber,B2)-TCumStats(GNumber,B3)-TCumStats(GNumber,HR)
TCumStats(GNumber,SLG)=INT(1000*(X+TCumStats(GNumber,B2)*2+TCumStats(GNumber,B3)*3+TCumStats(GNumber,HR)*4)/(TCumStats(GNumber,H)*4)+.5)
X=TCumTotals(H)-TCumTotals(B2)-TCumTotals(B3)-TCumTotals(HR)
TCumTotals(SLG)=INT(1000*(X+TCumTotals(B2)*2+TCumTotals(B3)*3+TCumTotals(HR)*4)/(TCumTotals(AB))+.5)
Skip4:
GOSUB Sorter
RETURN
Sorter:
CLS:LOCATE 11,35:COLOR 0,1:PRINT "SORTING......":COLOR 1,0
FOR I=1 TO NPlayers-1
FOR J=I+1 TO NPlayers
IF PCumStats(J,AVG)>PCumStats(I,AVG) THEN
SWAP PlayerName$(I),PlayerName$(J)
FOR X=1 TO NGSTATS
SWAP PGameStats(I,X),PGameStats(J,X)
SWAP PCumStats(I,X),PCumStats(J,X)
NEXT
FOR X=NGSTATS+1 TO NCSTATS
SWAP PCumStats(I,X),PCumStats(J,X)
NEXT
END IF
NEXT:NEXT
RETURN
SUB OpenRequest(filename$) STATIC
CALL StringRequest("Open Request","Open filename:","Open","Cancel",filename$)
END SUB
SUB SaveRequest(filename$) STATIC
CALL StringRequest("Save Request","Save as:","Save","Cancel",filename$)
END SUB
SUB StringRequest(title$,msg$,b1$,B2$,default$) STATIC
SHARED maxlen,ScrId,which,BoxIndex
BoxIndex=1:height=PEEKW(WINDOW(8)+58)
winwidth=maxlen*(8-2*(height=9))+40
WINDOW 2,title$,(0,0)-(winwidth,80),0,ScrId
PRINT:PRINT " ";msg$:PRINT
PRINT " ";:CALL TxBox(default$+SPACE$(1+maxlen-LEN(default$))) 'reserve space
Xpos=2:Ypos=CSRLIN 'for GetString
PRINT :PRINT :LOCATE ,2:CALL TxBox(b1$)
PRINT TAB(maxlen+3-LEN(B2$));:CALL TxBox(B2$)
which=0
WHILE which<=1
CALL WaitBox(which) 'Get box #
IF which=1 THEN 'if GetString
CALL GetString(Xpos,Ypos,default$)
END IF
WEND 'must be Open or Cancel
CALL FlashRelease(which) 'Flash the box
WINDOW CLOSE 2
IF which=BoxIndex-1 THEN filename$=""
END SUB
SUB Request(msg1$,msg2$,b1$,B2$,which) STATIC
SHARED BoxIndex,ScrId
SHARED x1(),y1(),x2(),y2()
BoxIndex=1:height=PEEKW(WINDOW(8)+58)
winwidth=20*(8-2*(height=9))+30
WINDOW 2,"System Request",(0,0)-(winwidth,50),0,ScrId
PRINT :PRINT TAB(11-LEN(msg1$)/2);msg1$
PRINT TAB(11-LEN(msg2$)/2);msg2$:PRINT
LOCATE ,2:TxBox b1$
PRINT TAB(20-LEN(B2$));:TxBox B2$:which=0
CALL WaitBox(which)
CALL FlashRelease(which)
WINDOW CLOSE 2
END SUB
SUB FlashRelease(which) STATIC
SHARED x1(),y1(),x2(),y2(),work%()
SHARED RelVerify
'These two lines flash the box
GET (x1(which),y1(which))-(x2(which),y2(which)),work%
PUT (x1(which),y1(which)),work%,PRESET
ix=MOUSE(1):iy=MOUSE(2):RelVerify=-1
WHILE MOUSE(0)<>0
IF MOUSE(1)<>ix OR MOUSE(2)<>iy THEN RelVerify=0
WEND
'This line restores the box
PUT (x1(which),y1(which)),work%,PSET
END SUB
SUB TxBox(msg$) STATIC
SHARED x1(),y1(),x2(),y2()
SHARED BoxIndex
x1=WINDOW(4):y1=WINDOW(5)-10
PRINT " ";msg$;" ";
x2=WINDOW(4):y2=y1+14
CALL Box(BoxIndex,x1,y1,x2,y2)
BoxIndex=BoxIndex+1
PRINT SPC(1);
END SUB
SUB Box(I,x1,y1,x2,y2) STATIC
SHARED x1(),y1(),x2(),y2()
IF x2<x1 THEN SWAP x1,x2
LINE (x1,y1)-(x2,y2),1-(WINDOW(6)>1),b
LINE (x1,y1)-(x2-1,y2-1),1,b
x1(I)=x1:y1(I)=y1:x2(I)=x2:y2(I)=y2
END SUB
SUB CheckBox(I,flag) STATIC
SHARED x1(),y1(),x2(),y2()
x1=x1(I)+2:y1=y1(I)+2
x2=x2(I)-2:y2=y2(I)-2
LINE (x1+3,y1+3)-(x2-3,y2-3),WINDOW(6)*-(flag<>0),BF
END SUB
SUB WaitBox(which) STATIC
which=0
WHILE which=0
CALL WhichBox(which)
WEND
EXIT SUB
RETURN
END SUB
SUB WhichBox(which) STATIC
SHARED x1(),y1(),x2(),y2(),BoxIndex
IF MOUSE(0)=0 THEN EXIT SUB
X=MOUSE(1):Y=MOUSE(2):I=1
WHILE I<BoxIndex AND NOT (X>x1(I) AND X<x2(I) AND Y>y1(I) AND Y<y2(I))
I=I+1
WEND
which=I:IF I=BoxIndex THEN which=0
END SUB
SUB GetString(Xpos,Ypos,default$) STATIC
SHARED maxlen,which
answer$=default$
IF maxlen=0 THEN maxlen=40
'Cursor appears at end of default string
csr=LEN(default$)+1
K$=""
WHILE K$<>CHR$(13)
LOCATE Ypos,Xpos+1:PRINT default$;" ";
LOCATE Ypos,Xpos+csr
COLOR 0,WINDOW(6) 'cursor is max color
PRINT MID$(default$+" ",csr,1)
COLOR 1,0:K$=""
WHILE K$="":K$=INKEY$
CALL WhichBox(I)
IF I>1 AND I<>which THEN which=I:K$=CHR$(13)
WEND
LOCATE Ypos,Xpos+1:PRINT default$;" ";
K=ASC(K$)
IF K>=32 AND K<127 THEN
default$=LEFT$(default$,csr-1)+K$+MID$(default$,csr)
default$=LEFT$(default$,maxlen)
csr=csr-(csr<maxlen)
END IF
IF K=31 OR K=8 THEN csr=csr+(csr>1)
IF K=127 OR K=8 THEN
default$=LEFT$(default$,csr-1)+MID$(default$,csr+1)
END IF
IF K=30 THEN csr=csr-(csr<maxlen)
WEND
END SUB
RETURN
ErrorTrap:
BEEP ' Get user's attention.
IF ERR=53 THEN
request1$="FILE NOT FOUND."
GOTO ExitError
END IF
IF ERR=61 THEN
request1$="DISK FULL."
GOTO ExitError
END IF
IF ERR=64 THEN
request1$="BAD FILENAME."
GOTO ExitError
END IF
IF ERR=67 THEN
request1$="DIRECTORY FULL."
GOTO ExitError
END IF
IF ERR=68 THEN
request1$="DEVICE UNAVAILABLE."
GOTO ExitError
END IF
IF ERR=70 THEN
request1$="DISK WRITE-PROTECTED."
GOTO ExitError
END IF
IF ERR=74 THEN
request1$="UNKNOWN DISK VOLUME."
GOTO ExitError
END IF
request1$="ERROR NUMBER"+STR$(ERR)
ExitError:
' Abort operation or try again.
' Define global variable scrid (SCREEN ID) if required:
ScrId=-1 'Error Requester will appear on Workbench screen.
CALL Requester (request1$,"","Retry","CANCEL",2,answer%)
IF answer%=0 THEN
CLOSE #1
X=1:GOSUB Ghost
RESUME Iloop ' Substitute your reentry point here.
ELSE
CLOSE #1
IF EFlag$="OPEN" THEN
RESUME OpenFile
ELSEIF EFlag$="SAVE" THEN
RESUME SaveFile
ELSE
RESUME
END IF
END IF
SUB Requester (msg1$,msg2$,b1$,B2$,hilite%,answer%) STATIC
SHARED ScrId 'Global variable for SCREEN ID.
IF ScrId<1 OR ScrId>4 THEN ScrId=-1 'Default to Workbench.
WINDOW 3,"Program Request",(0,0)-(311,45),16,ScrId
maxwidth=INT(WINDOW(2)/8) 'Truncate prompts if too long...
PRINT LEFT$(msg1$,maxwidth):PRINT LEFT$(msg2$,maxwidth)
b1$=LEFT$(b1$,12):B2$=LEFT$(B2$,12) 'Truncate buttons.
bsize1=(LEN(b1$)+2)*10:bsize2=(LEN(B2$)+2)*10 'Button size.
x1=(312-(bsize1+bsize2))/3 'Calculate button positions...
x2=x1+bsize1:x3=x1+x2:x4=x3+bsize2
'Draw buttons:
LINE (x1,20)-(x2,38),2,b:LINE (x3,20)-(x4,38),2,b
IF hilite%=1 THEN LINE (x1+2,22)-(x2-2,36),3,b
IF hilite%=2 THEN LINE (x3+2,22)-(x4-2,36),3,b
LOCATE 4,1:PRINT PTAB(x1+10);b1$;
PRINT PTAB(x3+10);B2$
Reqloop: 'Loop which acts on mouse clicks...
WHILE MOUSE(0)=0:WEND:m1=MOUSE(1):m2=MOUSE(2)
IF m1>x1 AND m1<x2 AND m2>20 AND m2<38 THEN
answer%=1 'Left button was selected.
LINE (x1,20)-(x2,38),1,BF 'Flash left button.
ELSEIF m1>x3 AND m1<x4 AND m2>20 AND m2<38 THEN
answer%=0 'Right button was selected.
LINE (x3,20)-(x4,38),1,BF 'Flash right button.
ELSE
GOTO Reqloop 'Neither button selected; repeat loop.
END IF
WHILE MOUSE(0)<>0:WEND:WINDOW CLOSE 3
END SUB